// import com.alibaba.druid.sql.ast.SQLDataType;
// import com.alibaba.druid.sql.ast.SQLExpr;
// import com.alibaba.druid.sql.ast.SQLName;
// import com.alibaba.druid.sql.ast.SQLObject;
// import com.alibaba.druid.sql.dialect.mysql.ast.MySqlObjectImpl;
// import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;

// import java.util.ArrayList;
// import java.util.List;

#include "MySqlJSONTableExpr.h"
#include "../../visitor/MySqlASTVisitor.h"
#include "../../../../ast/SQLDataType.h"
#include "../../../../ast/SQLExpr.h"
#include "../../../../ast/SQLName.h"
#include "../../../../ast/SQLObject.h"
#include "../../../../../utils/listTran.h"

MySqlJSONTableExpr_Column::MySqlJSONTableExpr_Column()
{
  nestedColumns = std::make_shared<std::list<MySqlJSONTableExpr_Column_ptr>>();
}
// @Override
void MySqlJSONTableExpr_Column::accept0(MySqlASTVisitor_ptr v)
{
  if (v->visit(SharedObject(MySqlJSONTableExpr_Column)))
  {
    acceptChild(v, name);
    acceptChild(v, dataType);
    acceptChild(v, path);
    acceptChild(v, onEmpty);
    acceptChild(v, onError);
  }
  v->endVisit(SharedObject(MySqlJSONTableExpr_Column));
}

SQLName_ptr MySqlJSONTableExpr_Column::getName()
{
  return name;
}

void MySqlJSONTableExpr_Column::setName(SQLName_ptr x)
{
  if (x != nullptr)
  {
    x->setParent(SharedObject(MySqlJSONTableExpr_Column));
  }
  this->name = x;
}

SQLDataType_ptr MySqlJSONTableExpr_Column::getDataType()
{
  return dataType;
}

void MySqlJSONTableExpr_Column::setDataType(SQLDataType_ptr x)
{
  if (x != nullptr)
  {
    x->setParent(SharedObject(MySqlJSONTableExpr_Column));
  }
  this->dataType = x;
}

SQLExpr_ptr MySqlJSONTableExpr_Column::getPath()
{
  return path;
}

void MySqlJSONTableExpr_Column::setPath(SQLExpr_ptr x)
{
  if (x != nullptr)
  {
    x->setParent(SharedObject(MySqlJSONTableExpr_Column));
  }
  this->path = x;
}

BOOL_ptr MySqlJSONTableExpr_Column::isOrdinality()
{
  return ordinality;
}

void MySqlJSONTableExpr_Column::setOrdinality(BOOL_ptr ordinality)
{
  this->ordinality = ordinality;
}

BOOL_ptr MySqlJSONTableExpr_Column::isExists()
{
  return exists;
}

void MySqlJSONTableExpr_Column::setExists(BOOL_ptr exists)
{
  this->exists = exists;
}

SQLExpr_ptr MySqlJSONTableExpr_Column::getOnError()
{
  return onError;
}

void MySqlJSONTableExpr_Column::setOnError(SQLExpr_ptr x)
{
  if (x != nullptr)
  {
    x->setParent(SharedObject(MySqlJSONTableExpr_Column));
  }
  this->onError = x;
}

SQLExpr_ptr MySqlJSONTableExpr_Column::getOnEmpty()
{
  return onEmpty;
}

void MySqlJSONTableExpr_Column::setOnEmpty(SQLExpr_ptr x)
{
  if (x != nullptr)
  {
    x->setParent(SharedObject(MySqlJSONTableExpr_Column));
  }
  this->onEmpty = x;
}

MySqlJSONTableExpr_Column_list_ptr MySqlJSONTableExpr_Column::getNestedColumns()
{
  return nestedColumns;
}

void MySqlJSONTableExpr_Column::addNestedColumn(MySqlJSONTableExpr_Column_ptr column)
{
  column->setParent(SharedObject(MySqlJSONTableExpr_Column));
  this->nestedColumns->push_back(column);
}

MySqlJSONTableExpr::MySqlJSONTableExpr()
{
  columns = std::make_shared<std::list<MySqlJSONTableExpr_Column_ptr>>();
}
// @Override
void MySqlJSONTableExpr::accept0(MySqlASTVisitor_ptr v)
{
  if (v->visit(SharedObject(MySqlJSONTableExpr)))
  {
    acceptChild(v, expr);
    acceptChild(v, path);
    SQLObject_list_ptr tmp1 = ListTran::tran_class<MySqlJSONTableExpr_Column, SQLObject>(columns);
    acceptChild(v, tmp1);
  }
  v->endVisit(SharedObject(MySqlJSONTableExpr));
}

// @Override
SQLObject_list_ptr MySqlJSONTableExpr::getChildren()
{
  return nullptr;
}

SQLExpr_ptr MySqlJSONTableExpr::getExpr()
{
  return expr;
}

void MySqlJSONTableExpr::setExpr(SQLExpr_ptr x)
{
  if (x != nullptr)
  {
    x->setParent(SharedObject(MySqlJSONTableExpr));
  }

  this->expr = x;
}

SQLExpr_ptr MySqlJSONTableExpr::getPath()
{
  return path;
}

void MySqlJSONTableExpr::setPath(SQLExpr_ptr x)
{
  if (x != nullptr)
  {
    x->setParent(SharedObject(MySqlJSONTableExpr));
  }
  this->path = x;
}

MySqlJSONTableExpr_Column_list_ptr MySqlJSONTableExpr::getColumns()
{
  return columns;
}

void MySqlJSONTableExpr::addColumn(MySqlJSONTableExpr_Column_ptr column)
{
  column->setParent(SharedObject(MySqlJSONTableExpr));
  this->columns->push_back(column);
}
